package py.com.alfa.escriba.web.services.impl;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import java.util.List;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.ControlesinmueblesDAO;
import py.com.alfa.escriba.persistence.dto.ControlesinmueblesDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.ControlesinmueblesService;

public class ControlesinmueblesServiceImpl implements ControlesinmueblesService{

  private ControlesinmueblesDAO controlesinmueblesDAO;

  public void setControlesinmueblesDAO(ControlesinmueblesDAO controlesinmueblesDAO) {
    this.controlesinmueblesDAO = controlesinmueblesDAO;
  }

  @Override
  public List<ControlesinmueblesDTO> listControlesinmuebles(InvocationContext ic) throws ServiceException {
    List<ControlesinmueblesDTO> controlesinmuebless =  controlesinmueblesDAO.listControlesinmuebles();

    return controlesinmuebless;
  }

  @Override
  public ControlesinmueblesDTO getControlesinmuebles(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlesinmueblesDTO controlesinmuebles =  controlesinmueblesDAO.getControlesinmueblesById(id);

    if (controlesinmuebles == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesinmuebles.notfound", id);

    return controlesinmuebles;
  }

  @Override
  public void deleteControlesinmuebles(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlesinmueblesDTO controlesinmuebles =  controlesinmueblesDAO.getControlesinmueblesById(id);

    if(controlesinmuebles == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesinmuebles.notfound", id);

    try {
      controlesinmueblesDAO.deleteControlesinmuebles(controlesinmuebles);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "controlesinmuebles.constraint.violation", id);
    }

  }

  @Override
  public ControlesinmueblesDTO updateControlesinmuebles(Long id, ControlesinmueblesDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    ControlesinmueblesDTO controlesinmuebles = controlesinmueblesDAO.getControlesinmueblesById(id);

    if (controlesinmuebles == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesinmuebles.notfound", id);

    controlesinmuebles.setIdcontrol(dto.getIdcontrol());
    controlesinmuebles.setIdinmueble(dto.getIdinmueble());
    controlesinmuebles.setOrden(dto.getOrden());
    controlesinmuebles.setIdmoneda(dto.getIdmoneda());
    controlesinmuebles.setValor(dto.getValor());
    controlesinmuebles.setFinca(dto.getFinca());
    controlesinmuebles.setMatricula(dto.getMatricula());
 

    Utils.validarDTO(dto);

    controlesinmueblesDAO.updateControlesinmuebles(dto);

    return controlesinmuebles;
  }

  @Override
  public ControlesinmueblesDTO createControlesinmuebles(ControlesinmueblesDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);

      controlesinmueblesDAO.createControlesinmuebles(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "controlesinmuebles.duplicate.key");
    }

    return dto;
  }

}